package fichier;
import java.awt.Color;
import java.io.*;
import modele.*;

//import org.jdom.*;
//import org.jdom.input.*;
//import org.jdom.Document;

//import java.util.List;
//import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.Vector;

public class Chargement
{
	public static Vector<String> vString;
	private boolean aucuneEq = true;
	
	public Chargement(File fichier)
	{
		try 
		{
			BufferedReader lecteurAvecBuffer = null;
			String ligne;
			vString = new Vector<String>();
			try
			{
				lecteurAvecBuffer = new BufferedReader(new FileReader(fichier));
			}
			catch(FileNotFoundException exc)
			{
				System.out.println("Erreur d'ouverture");
			}
			while ((ligne = lecteurAvecBuffer.readLine()) != null)
			{
				StringTokenizer st;
				st = new StringTokenizer(ligne, " \t\b\r\n:="); // Applique le StringTokenizer à chaîne
				while(st.hasMoreTokens())
				{	 // Retourne false lorsqu'on lit après le dernier mot
					String ss = st.nextToken();
					vString.add(ss);
				}// Lit dans une chaîne le prochain mot
			}
			if(!getDimension().equals("2") && !getDimension().equals("3"))
				System.err.println("Probleme de dimension");
			
			int ind = 0;
			for(int i=1;i<=Integer.parseInt(vString.get(1));i++)
			{
				Float f = Float.parseFloat(vString.get(vString.indexOf("optimisation")+i));
				if(f.isNaN())
					System.err.println("Probleme conversion dans optimisation");
			}
			if(getDimension().equals("2"))
			{
				if(!vString.get(5).equals("MAXIMISER") && !vString.get(5).equals("MINIMISER"))
					System.err.println("Probleme de valeur dans optimisation pour la 2D.");
			}
			if(getDimension().equals("3"))
			{
				if(!vString.get(6).equals("MAXIMISER") && !vString.get(6).equals("MINIMISER"))
					System.err.println("Probleme de valeur dans optimisation pour la 3D.");
			}
			for(int i=ind+1;i<vString.size();i++)
			{
				if(vString.get(i).equals("eq"))
				{
					if(getDimension().equals("2"))
						testEq2D(i);
					if(getDimension().equals("3"))
						testEq3D(i);
					aucuneEq = false;
				}
			}
		}
		catch (IOException e) 
		{
			e.printStackTrace();
		}
	}
	
	public boolean is3D()
	{
		return vString.get(1).equals("3");
	}
	
	public Object recupererFonctionAOptimiser()
	{
		if (getDimension().equals("2")) 
		{
			return new FonctionAOptimiser2D(
					new Float(vString.get(3)).floatValue(),
					new Float(vString.get(4)).floatValue(),
					vString.get(5).equals("MINIMISER"));
		}
		if (getDimension().equals("3")) 
		{
			return new FonctionAOptimiser3D(
					new Float(vString.get(3)).floatValue(),
					new Float(vString.get(4)).floatValue(),
					new Float(vString.get(5)).floatValue(),
					vString.get(6).equals("MINIMISER"));
		}
		return null ;
	}
	
	@SuppressWarnings("unchecked")
	public Vector recupererListeEquations()
	{
		Vector listeEquations = new Vector();
		try 
		{
			boolean ilResteDesEquations = true ;
			int indiceCourant = 6 ;
			if (getDimension().equals("3"))
				indiceCourant = 7 ;
			if(!aucuneEq)
			{
				while (ilResteDesEquations) 
				{
					if (getDimension().equals("2"))
					{
						String operateur = "<=";
						if (vString.get(indiceCourant+4).equals("SUP_EQ"))
							operateur = ">=";
						
						listeEquations.addElement(
									new Equation2D(
											new Float(vString.get(indiceCourant+2)).floatValue(),
											new Float(vString.get(indiceCourant+3)).floatValue(),
											operateur,
											new Float(vString.get(indiceCourant+5)).floatValue(),
											new Color(
													(new Integer(vString.get(indiceCourant+6))).intValue(),
													(new Integer(vString.get(indiceCourant+7))).intValue(),
													(new Integer(vString.get(indiceCourant+8))).intValue()
													),
											vString.get(indiceCourant+1)));
						indiceCourant+=9 ;
					}
					if(getDimension().equals("3"))
					{
						String operateur = "<=" ;
						if (vString.get(indiceCourant+5).equals("SUP_EQ"))
							operateur = ">=" ;
						listeEquations.addElement(
								new Equation3D(
										new Float(vString.get(indiceCourant+2)).floatValue(),
										new Float(vString.get(indiceCourant+3)).floatValue(),
										new Float(vString.get(indiceCourant+4)).floatValue(),
										operateur,
										new Float(vString.get(indiceCourant+6)).floatValue(),
										new Color(
												(new Integer(vString.get(indiceCourant+7))).intValue(),
												(new Integer(vString.get(indiceCourant+8))).intValue(),
												(new Integer(vString.get(indiceCourant+9))).intValue()
										),
										vString.get(indiceCourant+1)));
						indiceCourant+=10 ;
					}
				}	
				if (indiceCourant>=vString.size())
					ilResteDesEquations = false ;
			}
		} 
		catch (ArrayIndexOutOfBoundsException e) 
		{
			e.printStackTrace();
		}
		return listeEquations;
	}

	public static String getDimension()
	{
		return vString.get(1);
	}
	
	public static void testEq2D(int indice) 
	{
		Float f=Float.parseFloat(vString.get(indice+2));
		Float f2=Float.parseFloat(vString.get(indice+3));
		Float f3=Float.parseFloat(vString.get(indice+5));
		if(f.isNaN()||f2.isNaN()||f3.isNaN())
			System.err.println("Probleme conversion dans eq2D");
		if(!vString.get(10).equals("INF_EQ") && !vString.get(10).equals("SUP_EQ"))
			System.err.println("Probleme de valeur dans eq2D");
		try
		{
			Integer i=Integer.parseInt(vString.get(indice+6));
			Integer i2=Integer.parseInt(vString.get(indice+7));
			Integer i3=Integer.parseInt(vString.get(indice+8));
			if(i<0||i>255||i2<0||i2>255||i3<0||i3>255)
			{
				System.err.println("Probleme valeur couleur dans eq2D");
					throw new Exception("couleur n'est pas entre 0 et 255 lors de l'ouverture de 0") ;
			}
		}
		catch(NumberFormatException e)
		{
			System.err.println("Ce n'est pas un entier dans eq2D");
			e.printStackTrace();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	
	public static void testEq3D(int indice) 
	{
		Float f=Float.parseFloat(vString.get(indice+2));
		Float f2=Float.parseFloat(vString.get(indice+3));
		Float f3=Float.parseFloat(vString.get(indice+4));
		Float f4=Float.parseFloat(vString.get(indice+6));
		if(f.isNaN()||f2.isNaN()||f3.isNaN()||f4.isNaN())
			System.err.println("Probleme de conversion en float dans eq3D");
		if(!vString.get(12).equals("INF_EQ") && !vString.get(12).equals("SUP_EQ"))
			System.err.println("Probleme de valeur de signe dans eq3D");
		try
		{
			Integer i=Integer.parseInt(vString.get(indice+7));
			Integer i2=Integer.parseInt(vString.get(indice+8));
			Integer i3=Integer.parseInt(vString.get(indice+9));
			if(i<0||i>255||i2<0||i2>255||i3<0||i3>255)
			{
				System.err.println("Probleme valeur de couleur dans eq3D");
			}
		}
		catch(NumberFormatException e)
		{
			System.err.println("Ce n'est pas un entier dans eq3D");
		}
	}
}